package ar.com.android.alco.forms;


import android.app.Activity;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import ar.com.android.alco.dbHelpers.SQLALCOHelper;
import ar.com.android.alco.entities.DatosUsuario;
import ar.com.android.alco.providers.DatosUsuarioProvider;
import ar.com.android.alco.utils.Constants;

public class DatosUsuarioActivity extends Activity {
	private static final String TAG = "DatosUsuarioActivity";
	
	public enum SexoOpciones {
		HOMBRES(0), MUJERES(1), NINNOS(2), NINNAS(3);
		private int code;
		SexoOpciones(Integer code) {this.code = code;}
		public static SexoOpciones valueOf(int itemId) {
			for (SexoOpciones sexoOpciones : SexoOpciones.values()) {
                if (itemId == sexoOpciones.code) 
                    return sexoOpciones;
            } 
			return null;
		}
	}
	
	public enum FaseOpciones {
		INTENSIVA(0), FLEXIBLE(1), MANTENIMIENTO(2);
		private int code;
		FaseOpciones(Integer code) {this.code = code;}
		public static FaseOpciones valueOf(int itemId) {
			for (FaseOpciones faseOpciones : FaseOpciones.values()) {
                if (itemId == faseOpciones.code) 
                    return faseOpciones;
            } 
			return null;
		}
	}
	
	Toast msgDatosUsuario;
	
	TextView tituloActivity;
	EditText etNombreUsuario;
	Spinner spiSexo;
	Spinner spiFase;
	EditText etPesoInicio;
	EditText etPesoPosible;
	EditText etEMail;
	EditText etAltura;
	TextView tvIMC;
	TextView tvCreditos;
	
		
    @Override
    public void onStart()
    {
    	super.onStart();
    }
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.datos_usuario);
        
        try {
        	//Busco los Objectos del Formlario
        	tituloActivity = (TextView) findViewById(R.id.txtTitulo);
        	etNombreUsuario = (EditText) findViewById(R.id.etNombreUsuario);
        	etPesoInicio = (EditText) findViewById(R.id.etPesoInicio);
        	etPesoPosible = (EditText) findViewById(R.id.etPesoPosible);
        	etAltura = (EditText) findViewById(R.id.etAltura);
        	etEMail = (EditText) findViewById(R.id.etEMail);
        	
        	tvIMC = (TextView) findViewById(R.id.txtValIMC);
        	tvCreditos = (TextView) findViewById(R.id.txtValCreditos);
        	
            SpannableString content = new SpannableString(getString(R.string.DatosUsuario));
            content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
            tituloActivity.setText(content);
        	
        	//Populate Spinners
        	spiSexo = (Spinner) findViewById(R.id.spiSexo);
        	ArrayAdapter<CharSequence> adapterSexo = ArrayAdapter.createFromResource(this, R.array.sexo, android.R.layout.simple_spinner_item);
        	adapterSexo.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        	spiSexo.setAdapter(adapterSexo);

        	spiFase = (Spinner) findViewById(R.id.spiFase);
        	ArrayAdapter<CharSequence> adapterFase = ArrayAdapter.createFromResource(this, R.array.fase, android.R.layout.simple_spinner_item);
        	adapterFase.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        	spiFase.setAdapter(adapterFase);
        	
        	DatosUsuarioProvider datosUsuarioProvider = new DatosUsuarioProvider(DatosUsuarioActivity.this);
        	DatosUsuario datosUsuario = datosUsuarioProvider.getDatosUsuario(Constants.ID_USUARIO);
        	if(datosUsuario != null) {
        		etNombreUsuario.setText(datosUsuario.getNombreApellido());
        		etEMail.setText(datosUsuario.getEmail());
        		etPesoInicio.setText(datosUsuario.getPesoInicio().toString());
        		etPesoPosible.setText(datosUsuario.getPesoPosible().toString());
        		etAltura.setText(datosUsuario.getAltura().toString());
        		
        		tvIMC.setText(datosUsuario.getIMC().toString());
        		tvCreditos.setText(datosUsuario.getCreditosInicio().toString());
        		
        		if(datosUsuario.getSexo().equals(Constants.SEXO_HOMBRES)) {
        			spiSexo.setSelection(SexoOpciones.HOMBRES.code);
        		}
        		else if(datosUsuario.getSexo().equals(Constants.SEXO_MUJERES)) {
        			spiSexo.setSelection(SexoOpciones.MUJERES.code);
        		}
        		else if(datosUsuario.getSexo().equals(Constants.SEXO_NINNOS)) {
        			spiSexo.setSelection(SexoOpciones.NINNOS.code);
        		}
        		else if(datosUsuario.getSexo().equals(Constants.SEXO_NINNAS)) {
        			spiSexo.setSelection(SexoOpciones.NINNAS.code);
        		}
        		
        		if(datosUsuario.getFase().equals(Constants.FASE_INTENSIVA)) {
        			spiFase.setSelection(FaseOpciones.INTENSIVA.code);
        		}
        		else if(datosUsuario.getFase().equals(Constants.FASE_FLEXIBLE)) {
        			spiFase.setSelection(FaseOpciones.FLEXIBLE.code);
        		}
        		else if(datosUsuario.getFase().equals(Constants.FASE_MANTENIMIENTO)) {
        			spiFase.setSelection(FaseOpciones.MANTENIMIENTO.code);
        		}
        	}
        	
        	etAltura.setOnFocusChangeListener(new OnFocusChangeListener() {
				public void onFocusChange(View v, boolean hasFocus) {
					if(!hasFocus) {
						tvIMC.setText(calcularIMC().toString());
					}
				}
			});
        	
        	etPesoInicio.setOnFocusChangeListener(new OnFocusChangeListener() {
				public void onFocusChange(View v, boolean hasFocus) {
					if(!hasFocus) {
						tvCreditos.setText(calcularCreditos().toString());
					}
				}
			});
        	
        	spiSexo.setOnItemSelectedListener(new OnItemSelectedListener() {
				public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
					tvCreditos.setText(calcularCreditos().toString());
					
				}

				public void onNothingSelected(AdapterView<?> arg0) {
					tvCreditos.setText(calcularCreditos().toString());
				}
			});
        	
        	spiFase.setOnItemSelectedListener(new OnItemSelectedListener() {
				public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
					tvCreditos.setText(calcularCreditos().toString());
					
				}

				public void onNothingSelected(AdapterView<?> arg0) {
					tvCreditos.setText(calcularCreditos().toString());
				}
			});
    		
		} catch (Exception e) {
			Log.e(TAG, e.getMessage());
		}
    }
    
    public void onClickGuardarDatos(View v) throws Exception
    {

    	SQLALCOHelper sqlHelper = SQLALCOHelper.getHelper(this);
    	
    	if(etNombreUsuario.getText().toString().equals("")) {
			LayoutInflater inflater = getLayoutInflater();
			View layout = inflater.inflate(R.drawable.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

			TextView text = (TextView) layout.findViewById(R.id.text);
			text.setText(getText(R.string.msgInputNombreUsuario));

			Toast toast = new Toast(getApplicationContext());
			toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
			toast.setDuration(Toast.LENGTH_LONG);
			toast.setView(layout);
			toast.show();
			
    		etNombreUsuario.requestFocus();
    	}
    	else if(etEMail.getText().toString().equals("")) {
    		LayoutInflater inflater = getLayoutInflater();
			View layout = inflater.inflate(R.drawable.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

			TextView text = (TextView) layout.findViewById(R.id.text);
			text.setText(getText(R.string.msgInputEMail));

			Toast toast = new Toast(getApplicationContext());
			toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
			toast.setDuration(Toast.LENGTH_LONG);
			toast.setView(layout);
			toast.show();

    		etAltura.requestFocus();
    	}
    	else if(etPesoInicio.getText().toString().equals("")) {
    		LayoutInflater inflater = getLayoutInflater();
			View layout = inflater.inflate(R.drawable.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

			TextView text = (TextView) layout.findViewById(R.id.text);
			text.setText(getText(R.string.msgInputPesoInicio));

			Toast toast = new Toast(getApplicationContext());
			toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
			toast.setDuration(Toast.LENGTH_LONG);
			toast.setView(layout);
			toast.show();
			
    		etPesoInicio.requestFocus();
    	}
    	else if(etPesoPosible.getText().toString().equals("")) {
    		LayoutInflater inflater = getLayoutInflater();
			View layout = inflater.inflate(R.drawable.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

			TextView text = (TextView) layout.findViewById(R.id.text);
			text.setText(getText(R.string.msgInputPesoPosible));

			Toast toast = new Toast(getApplicationContext());
			toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
			toast.setDuration(Toast.LENGTH_LONG);
			toast.setView(layout);
			toast.show();
			
    		etPesoPosible.requestFocus();
    	}
    	else if(etAltura.getText().toString().equals("")) {
    		LayoutInflater inflater = getLayoutInflater();
			View layout = inflater.inflate(R.drawable.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

			TextView text = (TextView) layout.findViewById(R.id.text);
			text.setText(getText(R.string.msgInputAltura));

			Toast toast = new Toast(getApplicationContext());
			toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
			toast.setDuration(Toast.LENGTH_LONG);
			toast.setView(layout);
			toast.show();

    		etAltura.requestFocus();
    	}
    	else
    	{
    		sqlHelper.dbOpen();
    		
    		try {
    			sqlHelper.beginTransaction();
    			
    			DatosUsuarioProvider datosUsuarioProvider = new DatosUsuarioProvider(DatosUsuarioActivity.this);
    			
    			Double pesoInicial = Double.parseDouble(etPesoInicio.getText().toString());
    			Double altura = Double.parseDouble(etAltura.getText().toString());
    			Double pesoPosible = Double.parseDouble(etPesoPosible.getText().toString());
    			
    			datosUsuarioProvider.removeDatosUsuario();
    			DatosUsuario datosUsuario = new DatosUsuario();
    			datosUsuario.setNombreApellido(etNombreUsuario.getText().toString());
    			datosUsuario.setEmail(etEMail.getText().toString());
    			datosUsuario.setPesoInicio(pesoInicial);
    			datosUsuario.setPesoPosible(pesoPosible);
    			datosUsuario.setAltura(altura);
    			datosUsuario.setIMC(calcularIMC());
    			datosUsuario.setCreditosInicio(calcularCreditos());
    			
    			if(spiFase.getSelectedItemId() == FaseOpciones.INTENSIVA.code) {
					datosUsuario.setFase(Constants.FASE_INTENSIVA);
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.FLEXIBLE.code) {
					datosUsuario.setFase(Constants.FASE_FLEXIBLE);
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.MANTENIMIENTO.code) {
					datosUsuario.setFase(Constants.FASE_MANTENIMIENTO);
				}
    			
    			if(spiSexo.getSelectedItemId() == SexoOpciones.HOMBRES.code) {
    				datosUsuario.setSexo(Constants.SEXO_HOMBRES);
    			}
    			else if(spiSexo.getSelectedItemId() == SexoOpciones.MUJERES.code) {
    				datosUsuario.setSexo(Constants.SEXO_MUJERES);
    			}
    			else if(spiSexo.getSelectedItemId() == SexoOpciones.NINNOS.code) {
    				datosUsuario.setSexo(Constants.SEXO_NINNOS);
    			}
    			else if(spiSexo.getSelectedItemId() == SexoOpciones.NINNAS.code) {
    				datosUsuario.setSexo(Constants.SEXO_NINNAS);
    			}
    			
    			datosUsuarioProvider.insertDatosUsuario(datosUsuario);
    			
    			sqlHelper.commitTransaction();
    			
    			LayoutInflater inflater = getLayoutInflater();
    			View layout = inflater.inflate(R.drawable.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

    			TextView text = (TextView) layout.findViewById(R.id.text);
    			text.setText(getText(R.string.msgSaveOK));

    			Toast toast = new Toast(getApplicationContext());
    			toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
    			toast.setDuration(Toast.LENGTH_LONG);
    			toast.setView(layout);
    			toast.show();
				
			} catch (Exception e) {
    			sqlHelper.rollbackTransaction();
				Log.e(TAG, e.toString());
			}
	    	finally {
	    		sqlHelper.dbClose();
	    	}
    	}
    }
    
    public static Double tryParse(String text) {
    	try {
    		return new Double(text);
		} catch (NumberFormatException e) {
		    return 0D;
		}
	}
    
    private Double calcularIMC() {
    	
    	Double imc = 0D;
    	Double pesoInicial = tryParse(etPesoInicio.getText().toString());
    	Double altura = tryParse(etAltura.getText().toString());
    	
    	if(altura == 0)
    		return 0D;
    	
    	imc = pesoInicial / (altura * altura);
    	return Math.round(imc*100.0)/100.0;
    }
    
    private Double calcularCreditos() {
    	
    	Double creditos = 0D;
    	Double pesoInicial = tryParse(etPesoInicio.getText().toString());
    	
    	if(pesoInicial == 0)
    		return 0D;
    	
    	if(pesoInicial <= 150) {
	    	if(spiSexo.getSelectedItemId() == SexoOpciones.HOMBRES.code) {
				if(spiFase.getSelectedItemId() == FaseOpciones.INTENSIVA.code) {
					creditos = pesoInicial * 0.35;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.FLEXIBLE.code) {
					creditos = pesoInicial * 0.40;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.MANTENIMIENTO.code) {
					creditos = pesoInicial * 0.55;
				}
			}
			else if(spiSexo.getSelectedItemId() == SexoOpciones.MUJERES.code) {
				if(spiFase.getSelectedItemId() == FaseOpciones.INTENSIVA.code) {
					creditos = pesoInicial * 0.30;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.FLEXIBLE.code) {
					creditos = pesoInicial * 0.35;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.MANTENIMIENTO.code) {
					creditos = pesoInicial * 0.50;
				}
			}
			else if(spiSexo.getSelectedItemId() == SexoOpciones.NINNOS.code) {
				if(spiFase.getSelectedItemId() == FaseOpciones.INTENSIVA.code) {
					creditos = 0D;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.FLEXIBLE.code) {
					creditos = pesoInicial * 0.60;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.MANTENIMIENTO.code) {
					creditos = pesoInicial * 0.75;
				}
			}
			else if(spiSexo.getSelectedItemId() == SexoOpciones.NINNAS.code) {
				if(spiFase.getSelectedItemId() == FaseOpciones.INTENSIVA.code) {
					creditos = 0D;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.FLEXIBLE.code) {
					creditos = pesoInicial * 0.55;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.MANTENIMIENTO.code) {
					creditos = pesoInicial * 0.70;
				}
			}
    	}
    	else
    	{
	    	if(spiSexo.getSelectedItemId() == SexoOpciones.HOMBRES.code) {
				if(spiFase.getSelectedItemId() == FaseOpciones.INTENSIVA.code) {
					creditos = pesoInicial * 0.25;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.FLEXIBLE.code) {
					creditos = pesoInicial * 0.30;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.MANTENIMIENTO.code) {
					creditos = pesoInicial * 0.55;
				}
			}
			else if(spiSexo.getSelectedItemId() == SexoOpciones.MUJERES.code) {
				if(spiFase.getSelectedItemId() == FaseOpciones.INTENSIVA.code) {
					creditos = pesoInicial * 0.20;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.FLEXIBLE.code) {
					creditos = pesoInicial * 0.25;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.MANTENIMIENTO.code) {
					creditos = pesoInicial * 0.50;
				}
			}
			else if(spiSexo.getSelectedItemId() == SexoOpciones.NINNOS.code) {
				if(spiFase.getSelectedItemId() == FaseOpciones.INTENSIVA.code) {
					creditos = 0D;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.FLEXIBLE.code) {
					creditos = pesoInicial * 0.50;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.MANTENIMIENTO.code) {
					creditos = pesoInicial * 0.75;
				}
			}
			else if(spiSexo.getSelectedItemId() == SexoOpciones.NINNAS.code) {
				if(spiFase.getSelectedItemId() == FaseOpciones.INTENSIVA.code) {
					creditos = 0D;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.FLEXIBLE.code) {
					creditos = pesoInicial * 0.45;
				}
				else if(spiFase.getSelectedItemId() == FaseOpciones.MANTENIMIENTO.code) {
					creditos = pesoInicial * 0.70;
				}
			}
    	}
		
    	return Math.round(creditos*100.0)/100.0;
    }
}